Segment Tree [백준 11505 - Kotlin] 구간 곱 구하기 Segment TreekotlinSegment Tree 백준 3006번: 터보소트 이전 버블소트 문제에서 쿼리 날리는 순서를 바꾸기만 하면 풀 수 있다. 0 ~ i이랑 N-1-i ~ N-1 번갈아서 날려주면 1, N, 2, N-1 순서로 정렬 가능. 터보소트 (느림)... Segment TreepscppSegment Tree 백준 2243번: 사탕상자 각 구간에서의 사탕 개수 합을 저장한다. rank번째로 맛있는 사탕을 사탕을 구할때는 세그먼트 트리에서 binary search를 하면 된다! 루트부터 시작해서, left node에 저장된 합이 rank보다 크거나 같은 경우는 왼쪽으로, rank가 더 큰 경우는 오른쪽으로 가면 된다. 이때 다음 서브트리에서도 똑같은 규칙을 적용하기 위해 rank에서 left node에 저장된 합만큼 빼준다.... Segment TreepsBinary SearchcppBinary Search 백준 2517번: 달리기 자기보다 실력 높은사람 몇명 있는지 구하면 된다. 그런데 실력의 최댓값이 10억이다. 사이즈 10억짜리 배열을 만들면 터지니까 좌표 압축을 해야한다. N은 최대 50만이니까 충분히 가능하다. 좌표 압축은 map으로 했다. 실력순으로 정렬 후 제일 작은 값부터 순서대로 0, 1, 2…. 간당간당하게 통과했다. 다른사람들 푼거 보니까 pair<int, int>로 하나는 실력, 하나는 압축된 좌표... Segment TreeCoordinate CompressionpscppCoordinate Compression 백준 7578번: 공장 A열 입력을 받을 때 기계의 식별번호를 인덱스로 하는 배열에 해당 기계가 A열에서 몇번 인덱스에 위치하는지 기록한다. B열 입력을 받을 때, A열 몇번 인덱스에 위치하는지 구하고, 그 위치부터 오른쪽으로 맨 끝까지 구간에서 줄이 연결된 개수를 구하면 된다. 이런 느낌으로! 답이 int 범위를 벗어나니 조심.... Segment TreepscppSegment Tree 백준 2042번: 구간 합 구하기 세그먼트 트리 연습 문제다. 루트에는 전부 합한 값이, 그 자식은 구간을 반씩 잘라서 그 구간에 해당하는 값을 가지고 있다. 왼쪽 자식은 부모 인덱스 * 2, 오른쪽 자식은 부모 인덱스 * 2 + 1이다. (루트는 1부터) 어떤 구간의 합이라도 O(logN)으로 구할 수 있다. 루트부터 필요한 구간이 나올 때까지 왼쪽, 오른쪽 재귀호출한다. 또 이렇게 합을 저장해놓으면 중간에 값의 변경이 일... Segment TreepscppSegment Tree 백준 1517번: 버블 소트 문제 이름은 버블 소트지만 버블 소트 하면서 몇번 swap했나 세면 당연히 틀린다. N이 최대 500,000이므로 O(NlogN)에 풀어야 한다. 세그트리에 정렬 여부를 기록한다. 쿼리를 날리면 해당 구간에 정렬되지 않은 원소가 몇개인지 합을 구해서 알려준다. 작은 숫자부터(sort()하면 NlogN에 가능) 0 ~ 자기 인덱스에 정렬되지 않은 원소가 몇개인지 세서 정답에 더한다. 그리고 세... Segment TreepscppSegment Tree
[백준 11505 - Kotlin] 구간 곱 구하기 Segment TreekotlinSegment Tree 백준 3006번: 터보소트 이전 버블소트 문제에서 쿼리 날리는 순서를 바꾸기만 하면 풀 수 있다. 0 ~ i이랑 N-1-i ~ N-1 번갈아서 날려주면 1, N, 2, N-1 순서로 정렬 가능. 터보소트 (느림)... Segment TreepscppSegment Tree 백준 2243번: 사탕상자 각 구간에서의 사탕 개수 합을 저장한다. rank번째로 맛있는 사탕을 사탕을 구할때는 세그먼트 트리에서 binary search를 하면 된다! 루트부터 시작해서, left node에 저장된 합이 rank보다 크거나 같은 경우는 왼쪽으로, rank가 더 큰 경우는 오른쪽으로 가면 된다. 이때 다음 서브트리에서도 똑같은 규칙을 적용하기 위해 rank에서 left node에 저장된 합만큼 빼준다.... Segment TreepsBinary SearchcppBinary Search 백준 2517번: 달리기 자기보다 실력 높은사람 몇명 있는지 구하면 된다. 그런데 실력의 최댓값이 10억이다. 사이즈 10억짜리 배열을 만들면 터지니까 좌표 압축을 해야한다. N은 최대 50만이니까 충분히 가능하다. 좌표 압축은 map으로 했다. 실력순으로 정렬 후 제일 작은 값부터 순서대로 0, 1, 2…. 간당간당하게 통과했다. 다른사람들 푼거 보니까 pair<int, int>로 하나는 실력, 하나는 압축된 좌표... Segment TreeCoordinate CompressionpscppCoordinate Compression 백준 7578번: 공장 A열 입력을 받을 때 기계의 식별번호를 인덱스로 하는 배열에 해당 기계가 A열에서 몇번 인덱스에 위치하는지 기록한다. B열 입력을 받을 때, A열 몇번 인덱스에 위치하는지 구하고, 그 위치부터 오른쪽으로 맨 끝까지 구간에서 줄이 연결된 개수를 구하면 된다. 이런 느낌으로! 답이 int 범위를 벗어나니 조심.... Segment TreepscppSegment Tree 백준 2042번: 구간 합 구하기 세그먼트 트리 연습 문제다. 루트에는 전부 합한 값이, 그 자식은 구간을 반씩 잘라서 그 구간에 해당하는 값을 가지고 있다. 왼쪽 자식은 부모 인덱스 * 2, 오른쪽 자식은 부모 인덱스 * 2 + 1이다. (루트는 1부터) 어떤 구간의 합이라도 O(logN)으로 구할 수 있다. 루트부터 필요한 구간이 나올 때까지 왼쪽, 오른쪽 재귀호출한다. 또 이렇게 합을 저장해놓으면 중간에 값의 변경이 일... Segment TreepscppSegment Tree 백준 1517번: 버블 소트 문제 이름은 버블 소트지만 버블 소트 하면서 몇번 swap했나 세면 당연히 틀린다. N이 최대 500,000이므로 O(NlogN)에 풀어야 한다. 세그트리에 정렬 여부를 기록한다. 쿼리를 날리면 해당 구간에 정렬되지 않은 원소가 몇개인지 합을 구해서 알려준다. 작은 숫자부터(sort()하면 NlogN에 가능) 0 ~ 자기 인덱스에 정렬되지 않은 원소가 몇개인지 세서 정답에 더한다. 그리고 세... Segment TreepscppSegment Tree